package pb

import (
	. "chess_platform/internal/common"
	"chess_platform/models/h5"
	"chess_platform/models/partner"
	"chess_platform/models/pb"
	"chess_platform/modules"
	"fmt"
)

//[pc]agent:代理管理
type AgentController struct {
	GrantController
}

func (b *AgentController) URLMapping() {
	//formal:代理列表
	b.Mapping("ListLevelUser", b.ListLevelUser)
	b.Mapping("UpdateBonusRate", b.UpdateBonusRate)

	//informal:代理审核
	b.Mapping("MakeAgentFormal", b.MakeAgentFormal)
	b.Mapping("ManualReview", b.ManualReview)
	b.Mapping("ListInformalPfUser", b.ListInformalPfUser)
}

// @Title 列出不同等级的合伙人代理(正式代理)
// @Description 列出不同等级合伙人代理(正式代理)
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   uid          body   int     true       "查找某个具体的代理uid,初始时传0"
// @Param   pid          body   int     true       "代理pid,传了pid查看下级代理"
// @Success 0 {object} [] 代理列表
// @router /formal/list-level-user [post]
func (b *AgentController) ListLevelUser() {
	type Params struct {
		Uid int64 `json:"uid"`
		Pid int64 `json:"pid"`
		ListParams
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	users, count, err := pb.ListLevelUser(p.ListParams, b.Uid, p.Uid, p.Pid)
	if err != nil {
		LogPF.Error(b.DatabaseError(err.Error()))
		return
	}

	if len(users) == 0 { //没有更多的二级代理
		b.Res.Count = count
		b.Res.Code = ErrNoData
		b.Res.Msg = MsgErrNoData
		b.Response()
		return
	}

	oc := NewDBOrm(DBChess)
	o := NewDBOrm(DBChessPartner)
	for _, v := range users {
		v["total_player"] = partner.CountAgentPlayer(v["uid"], oc)        //代理名下直属的玩家数(玩家数)
		v["today_player"] = partner.TodayAgentPlayer(v["uid"], oc)        //代理名下直属的玩家数(新增玩家数)
		v["next_agent_count"] = partner.CountNextLevelAgent(v["uid"], o)  //直接下级代理数(直接代理数)
		v["all_agent_count"] = partner.CountRootAllAgent(v["root_id"], o) //总代名下所有代理数(代理数)
		v["today_agent"] = partner.TodayAgent(v["uid"], o)                //新增直属代理数(新增代理数)
		v["today_charge"] = partner.AgentTodayCharge(v["uid"], o)         //代理今日充值
		v["total_charge"] = partner.AgentTotalCharge(v["uid"], o)         //代理总充值
		v["consume_card"] = partner.PlayerConsumeCard(v["uid"], oc)       //代理(玩家)玩游戏消耗的钻石
	}

	b.Res.Data = users
	b.Res.Count = count
	b.ResponseSuccess()

}

// @Title 合伙人给总代更新代理提成比例
// @Description 合伙人给总代更新代理提成比例
// @Param   uid            body    int     true      "代理的id"
// @Param   bonus_rate     body    int     true       "下一级提成比例(存储时乘以100)"
// @Success 0 {string} 状态码
// @router /formal/update-bonus-rate [post]
func (b *AgentController) UpdateBonusRate() {
	type Params struct {
		Uid       int64 `json:"uid" valid:"Required"`
		BonusRate int64 `json:"bonus_rate"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}

	bonus1, _ := h5.RuleByType(RulePfNextBonus)  //直属一级代理提成比例
	bonus2, _ := h5.RuleByType(RulePfNNextBonus) //直属二级代理提成比例

	bonus := bonus1.Amount + bonus2.Amount
	if p.BonusRate < bonus {
		b.ResponseFail(fmt.Sprintf("总代提成比倒不能小于直属一级与直属二级比例之和%v%%", bonus/100))
		return
	}

	//不能低于总代以前的的提成比例
	field := []string{"bonus_rate", "group_id"}
	u, err := partner.SpecifyUserInfoById(p.Uid, field)
	if err != nil {
		LogPB.Error(b.DatabaseError(err.Error()))
		return
	}
	if u == nil {
		b.ResponseFail("总代不存在")
		return
	}
	if u.GroupId != b.Uid {
		b.ResponseFail("不能修改不是自己总代提成比例")
		return
	}
	if p.BonusRate < u.BonusRate {
		b.ResponseFail(fmt.Sprintf("提成比例不能低于%v%%", u.BonusRate/100))
		return
	}

	//不能超过合伙人的提成比例
	pbUser, err := pb.UserInfoById(b.Uid)
	if err != nil {
		LogPB.Error(b.DatabaseError(err.Error()))
		return
	}
	//pbUser.BonusRate是公司的分成比例, 10000-pbUser.BonusRate才是合伙人的分成比例
	if p.BonusRate > (10000 - pbUser.BonusRate) {
		b.ResponseFail(fmt.Sprintf("提成比例不能超过%v%%", (10000-pbUser.BonusRate)/100))
		return
	}

	user := map[string]interface{}{
		"bonus_rate": p.BonusRate,
	}
	_, err = pb.UpdatePfUser(user, p.Uid)
	if err != nil {
		LogPB.Error(b.DatabaseError(err.Error()))
		return
	}
	b.ResponseSuccess()
}

// @Title 人工审核总代(一级代理)
// @Description 人工审核总代(一级代理)
// @Param   status         body   int     true       "4-通过，3-不通过"
// @Param   uid            body   int     true       "要审核的用户id"
// @Success 0 {string} 状态码
// @router /informal/manual-review [post]
func (b *AgentController) ManualReview() {
	type Params struct {
		Status int64 `json:"status" valid:"Range(3,4)"`
		Uid    int64 `json:"uid" valid:"Required"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	//审核之前先判断下代理绑定了手机了没有
	field := []string{"status", "level"}
	u, err := partner.SpecifyUserInfoById(p.Uid, field)
	if err != nil {
		LogPB.Error(b.DatabaseError(err.Error()))
		return
	}
	if u.Level != Level1 {
		b.ResponseFail("只能审核总代")
		return
	}
	if u.Status < BindPhoneSuccess {
		b.ResponseFail("代理还未绑定手机,请等待")
		return
	}
	user := map[string]interface{}{
		"status": p.Status,
	}
	_, err = partner.UpdateUser(user, p.Uid)
	if err != nil {
		LogPB.Error(b.DatabaseError(err.Error()))
		return
	}
	b.ResponseSuccess()
}

// @Title 修改代理的状态为正式代理(直接跳过第一次充值)
// @Description 修改代理的状态为正式代理(直接跳过第一次充值)
// @Param   uid            body   int     true       "要审核的用户id"
// @Success 0 {string} 状态码
// @router /informal/make-agent-formal [post]
func (b *AgentController) MakeAgentFormal() {
	type Params struct {
		Uid int64 `json:"uid" valid:"Required"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	err := modules.InitPartnerAgent(p.Uid, 0)
	if err == MsgAgentAlreadyFormal {
		b.ResponseFail(MsgAgentAlreadyFormal.Error())
		return
	}
	if err != nil {
		LogPB.Error(b.DatabaseError(err.Error()))
		return
	}
	b.ResponseSuccess()
}

// @Title 获取合伙人名下的所有非正式总代
// @Description 获取合伙人名下的所有非正式总代
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   uid          body   int     false      "搜索总代uid"
// @Param   phone        body   string  false      "搜索总代的手机号"
// @Success 0 {object} []common.H5User 代理用户列表
// @router /informal/list-unofficial-h5user [post]
func (b *AgentController) ListInformalPfUser() {
	type Params struct {
		ListParams
		Uid   int64  `json:"uid"`
		Phone string `json:"phone"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	user, err := pb.ListAllExpirePfUser()
	if err != nil {
		LogPB.Error(b.DatabaseError(err.Error()))
		return
	}
	for _, v := range user {
		partner.HandleAgentStatus(v.CreateTime, v.Uid, 0, b.Uid, false)
	}

	users, count, err := pb.ListUnofficialPfUser(p.ListParams, p.Phone, p.Uid)
	if err != nil {
		LogPB.Error(b.DatabaseError(err.Error()))
		return
	}

	b.Res.Data = users
	b.Res.Count = count
	b.ResponseSuccess()
}
